package ar.edu.unq.edp.futbol.mains;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;

import unq.equipos.dom.Equipo;
import unq.equipos.dom.FormacionStrategy;
import unq.equipos.dom.FormacionStrategyImpl;
import unq.equipos.dom.Habilidad;
import unq.equipos.dom.HabilidadImpl;
import unq.equipos.dom.Jugador;
import unq.equipos.dom.Posicion;
import unq.equipos.dom.Tecnico;

public class RetrieveTeam {
	public static int equipoId;
	
	public static void saveTeam() {
		Jugador jugador1, jugador2, jugador3, jugador4, jugador5, jugador6,
			jugador7, jugador8, jugador9, jugador10, jugador11, jugador12;
		Habilidad habilidadJugador1, habilidadJugador2, habilidadJugador3,
			habilidadJugador4, habilidadJugador5, habilidadJugador6,
			habilidadJugador7, habilidadJugador8, habilidadJugador9,
			habilidadJugador10, habilidadJugador11, habilidadJugador12;
		FormacionStrategy formacion;
		Equipo equipo;
		Tecnico tecnico;

		// Esta instancia es thread safe
		SessionFactory sessionFactory = new Configuration().configure()
				.buildSessionFactory();

		// esta ya no es threadSafe
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		habilidadJugador1 = new HabilidadImpl(Posicion.Lateral, 5);
		habilidadJugador2 = new HabilidadImpl(Posicion.Arquero, 1);
		habilidadJugador3 = new HabilidadImpl(Posicion.Lateral, 9);
		habilidadJugador4 = new HabilidadImpl(Posicion.Lateral, 9);
		habilidadJugador5 = new HabilidadImpl(Posicion.Central, 9);
		habilidadJugador6 = new HabilidadImpl(Posicion.Central, 9);
		habilidadJugador7 = new HabilidadImpl(Posicion.VolanteDefensivo, 9);
		habilidadJugador8 = new HabilidadImpl(Posicion.VolanteLateral, 9);
		habilidadJugador9 = new HabilidadImpl(Posicion.VolanteLateral, 9);
		habilidadJugador10 = new HabilidadImpl(Posicion.Enganche, 9);
		habilidadJugador11 = new HabilidadImpl(Posicion.Delantero, 9);
		habilidadJugador12 = new HabilidadImpl(Posicion.MediaPunta, 9);

		jugador1 = new Jugador("0");
		jugador1.agregarHabilidad(habilidadJugador1);
		jugador2 = new Jugador("a");
		jugador2.agregarHabilidad(habilidadJugador2);
		jugador3 = new Jugador("b");
		jugador3.agregarHabilidad(habilidadJugador3);
		jugador4 = new Jugador("c");
		jugador4.agregarHabilidad(habilidadJugador4);
		jugador5 = new Jugador("d");
		jugador5.agregarHabilidad(habilidadJugador5);
		jugador6 = new Jugador("e");
		jugador6.agregarHabilidad(habilidadJugador6);
		jugador7 = new Jugador("f");
		jugador7.agregarHabilidad(habilidadJugador7);
		jugador8 = new Jugador("g");
		jugador8.agregarHabilidad(habilidadJugador8);
		jugador9 = new Jugador("h");
		jugador9.agregarHabilidad(habilidadJugador9);
		jugador10 = new Jugador("i");
		jugador10.agregarHabilidad(habilidadJugador10);
		jugador11 = new Jugador("j");
		jugador11.agregarHabilidad(habilidadJugador11);
		jugador12 = new Jugador("k");
		jugador12.agregarHabilidad(habilidadJugador12);

		tecnico = new Tecnico("Tete");
		
		List<Posicion> posiciones = new ArrayList<Posicion>();
		posiciones.add(Posicion.Arquero);
		posiciones.add(Posicion.Lateral);
		posiciones.add(Posicion.Lateral);
		posiciones.add(Posicion.Central);
		posiciones.add(Posicion.Central);
		posiciones.add(Posicion.VolanteDefensivo);
		posiciones.add(Posicion.VolanteLateral);
		posiciones.add(Posicion.VolanteLateral);
		posiciones.add(Posicion.Enganche);
		posiciones.add(Posicion.Delantero);
		posiciones.add(Posicion.MediaPunta);
		formacion = new FormacionStrategyImpl(posiciones);
		
		tecnico.setFormacionStrategy(formacion);
		
		equipo = new Equipo("wsd");
		equipo.agregarJugador(jugador1, jugador2, jugador3, jugador4, jugador5,
				jugador6, jugador7, jugador8, jugador9, jugador10, jugador11, jugador12);
		equipo.setTecnico(tecnico);

		try {
			session.save(equipo);
			transaction.commit();
			equipoId = equipo.getId();
		} catch (RuntimeException e) {
			transaction.rollback();
			throw e;
		} finally {
			session.close();
		}
	}
	
	public static void main(String[] args) {
		saveTeam();
		SessionFactory sessionFactory = new Configuration().configure()
		.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Equipo losGrossos = (Equipo)session.createCriteria(Equipo.class)
					.add(Restrictions.idEq(equipoId))
					.uniqueResult();
		losGrossos.armarFormacion();
	}
}
